package com.hk.commons.util;

import java.time.Instant;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

/**
 * ID生成器
 *
 * @param <T>
 * @author kevin
 * @date 2017年8月22日下午1:32:03
 */
@FunctionalInterface
public interface IDGenerator<T> {

    /**
     * UUID生成 ，去掉 "-"
     */
    static IDGenerator<String> stringUUID() {
        return () -> UUID.randomUUID().toString().replaceAll(StringUtils.RUNG, StringUtils.EMPTY);
    }

    /**
     * 32 位 使用ThreadLocalRandom获取UUID获取更优的效果 去掉"-"
     */
    static IDGenerator<String> uuid32() {
        return () -> {
            ThreadLocalRandom random = ThreadLocalRandom.current();
            return new UUID(random.nextLong(), random.nextLong()).toString().replaceAll(StringUtils.RUNG,
                    StringUtils.EMPTY);
        };
    }

    static IDGenerator<Long> epochMilli() {
        return () -> Instant.now().toEpochMilli();
    }

    /**
     * 生成Id
     *
     * @return ID
     */
    T generate();
}
